﻿using System;

namespace 面向对象之派生类的构造函数
{
    class Program
    {
        static void Main(string[] args)
        {
            //
            Bases b = new Bases("a",18);
        }
    }
    class Base
    {
        //构造函数的作用：帮助我们初始化对象（给对象的每一个属性依次赋值）
        public string sex;
        public Base()//无参数的构造函数
        {
            Console.WriteLine("Inside Base Class"); //in 在...里面 ，side ：一边 ；inside=在里面
        }
        public Base(string sex)//有参数的构造函数
        {
            this.sex = sex;
            Console.WriteLine($"Inside Base Class sex={sex}");
            //this 关键字
            //this : 这，这里、这个，在c# 中用来表示这个类型的实例（对象）自身
            //1、代表当前类的对象
            //2、在类当中显示的调用本类的构造函数
        }
        public void Eat()
        {
            Console.WriteLine("吃");
        }
    }
    class Bases : Base//继承于Base类
    {
        // 子类、派生类 的无参构造函数，使用 :base() 的方式唤起基类的默认初始化行为
        // 构造函数用于初始化一个类型里面的数据。
        // base：基地，基础，基：垫底的，底层的。
        // base: 一般代表了基类
        // base() :代表基类的构造函数
        // base.Eat() :代表了基类的一个常规的方法
        // base.age：基类中的字段
        public int age;//年龄
        public string name;//姓名


        public Bases()
        { 
            base.Eat();//代表了基类中的一个Eat方法
         name = base.sex;

        }
        // 有参构造函数，使用 :base(参数)  的形式用于调用基类中的有参构造函数来初始化
        // 优势：子类可以省下初始化某个参数的过程
        public Bases(string sex, int age) : base(sex)//调用父类已经声明的字段
        {
            this.age = age;
            Console.WriteLine($"inside derived class , sex={this.sex} - age ={this.age}");
        }

        public Bases(string name, string sex, int age) : this(sex: sex, age: age)  //sex: 和 age： 是声明对指定的参数进行赋值
        {
            this.name = name;
        }


    }
}
